package com.obelisco.modelo.dao.hibernate;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.modelo.dao.IBitacoraDAO;
import com.obelisco.modelo.dao.IGrupoDAO;
import com.obelisco.modelo.dao.ITipoEventoDAO;
import com.obelisco.modelo.data.Bitacora;
import com.obelisco.modelo.data.DataGenerica;
import com.obelisco.modelo.data.Grupo;
import com.obelisco.modelo.data.Sistema;
import com.obelisco.modelo.data.TipoEvento;
import com.obelisco.modelo.data.Usuario;

public class BitacoraDAO extends HibernateDAO implements IBitacoraDAO {

	public Bitacora findByPK(Serializable clave) {
		// TODO Auto-generated method stub
		return null;
	}

	public List loadAll() {
		return loadAll(Bitacora.class);
	}

	
	ClassValidator bitacoraValidator = new ClassValidator(Bitacora.class,ResourceBundle.getBundle("com.obelisco.modelo.data.hibernate-validator"));
	
	public void validate(Bitacora objeto) {

		InvalidValue[] validationMessages =  bitacoraValidator.getInvalidValues(objeto);

		StringBuffer errores = new StringBuffer();
		for (int i = 0; i < validationMessages.length; i++) {
			InvalidValue value = validationMessages[i];
			errores.append(value.getPropertyName() + " - "+ value.getMessage() + "<br/>");
		}
		
		if (errores.length() > 0) {
			
			throw new ObeliscoException(errores.toString());
		}

	}
	
	public void save(Bitacora objeto) {
		
		validate(objeto);
		getHibernateTemplate().saveOrUpdate(objeto);
	}

	public List findByProperty(String propertyName, Object value) {
		try {
			String queryString = "from Bitacora model where model."
					+ propertyName + "= ?";
			return getHibernateTemplate().find(queryString, value);
		} catch (RuntimeException re) {
			// log.error("find by property name failed", re);
			throw re;
		}
	}

	public List find(Sistema sistema, TipoEvento evento, Date fechaInicio,
			Date fechaFin, String usuario, String fuente) {
		List l = new ArrayList();
		
		try {
			Session session = getSession();
			
			Criteria c = session.createCriteria(Bitacora.class);
			
			c.add(Expression.eq("sistema", sistema));
			
			if (evento != null) {
				c.add(Expression.eq("tipoevento", evento));
			}
			
			if (usuario != null && usuario.trim().length() > 0) {
				c.add(Expression.like("usuario", usuario));
			}
			
			if (fuente != null && fuente.trim().length() > 0) {
				c.add(Expression.like("fuente", fuente));
			}

			c.add(Expression.ge("fecha", fechaInicio));
			c.add(Expression.le("fecha", fechaFin));
			
			l = c.list();
			
		} catch (RuntimeException re) {
			// log.error("find by property name failed", re);
			throw re;
		}
		
		
		
		return l;
	}

	public List loadAll(Sistema sistema) {
		// TODO Auto-generated method stub
		return findByProperty("sistema", sistema);
	}

}
